package org.raymond.iworks.study.basic.structure.queue;


public class ArrayQueue<E> {
    // 数组最大容量
    private int max;
    // 指向队列头
    private int front;
    // 指向队列尾
    private int tail;
    // 存放数据的数组
    private Object[] array;

    public ArrayQueue(int max){
        this.max = max;
        // front表示头的前一个位置,初始化为-1
        // tail表示尾的位置,初始化为-1
        // 数组下标是从0开始的,即头部的下标为0,头部没有数据,则用一个不存在的位置(-1)来初始化
        front = -1;
        tail = -1;
        array = new Object[max];
    }

    // 判断队列是否已满
    public boolean isFull(){
        // max表示最大容量,数组下标是从0开始,因此下标最大为max-1,也就是tail的最大值
        return tail == max-1;
    }
    // 判断队列是否为空
    public boolean isEmpty(){
        // front==-1可能是有数据的,比如front=-1,tail=2,即表示有3个数据.
        return front == tail;
    }
    // 添加数据到队列
    public void add(E e){
        if(isFull()) {
            System.out.println("队列已满,不能加入数据");
            return;
        }
        tail++;
        array[tail] = e;
    }
    // 数据出队列
    public E pop(){
        if(isEmpty()){
            System.out.println("队列已空,没有数据可以获取");
            return null;
        }
        front++;
        return (E)array[front];
    }
    public void showAll(){
        if(isEmpty()){
            System.out.println("队列已空,没有数据可以展示");
            return;
        }
        StringBuilder dataBuilder = new StringBuilder();
        for(int i=0; i<tail+1; i++){
            dataBuilder.append("array[").append(i).append("]=")
                    .append(array[i].toString()).append("\n");
        }
        String data = dataBuilder.toString();
        System.out.println("data:\n" + data);
    }
    public E peekHead(){
        if(isEmpty()){
            System.out.println("队列已空,没有数据可以peek");
            return null;
        }
        // 这里只是查看头数据,front需要临时+1以便移动到有值的位置上
        return (E)array[front+1];
    }
}
